const fs = require('fs')
let Decoder  = require('video-decoder')
var jpeg = require('jpeg-js');
// const {H264Decoder } = require('H264Decoder')
var {h264_mp4toannexb, getFileInfoAsync } = require( './mp4Decoder.js')
var {Mp4FindMoov } = require('./mp4Decoder.js')
const mp4Parser = require('mp4')
// 引入fs的promise形式，避免使用回调
let  fsPromise  = require( 'fs/promises');

 async function  main(){
	    const filename='./video_2.mp4'
	    // let mp4Info =await Mp4FindMoov(filename)
	    // console.log(mp4Info)
	    // return
	    const MP4_FRAME_MAX_LEN = 1024 * 1024 //定义最大帧长度

	    let buff = Buffer.alloc(MP4_FRAME_MAX_LEN)
	    // step1 解析MP4结构,最重要是解析出sample1的offset
	    // video_2 16120 video_3 
	    let sample1_offset = 16120

	    // step2 读出数据,以最大帧长度为单位
	   let filehandle =  await fsPromise.open(filename)
	   let { buffer , bytesRead} =await filehandle.read(buff, 0, MP4_FRAME_MAX_LEN, sample1_offset )

	   let annexbNalu =   h264_mp4toannexb(buffer)
	  if(!annexbNalu){
	  	 console.log('转码失败')
	  	 return
	  }
	  // console.log('转码annexb后:',annexbNalu,annexbNalu.length)
	  // console.log('annexbNalu first 50:',annexbNalu.slice(0,50))
	  // console.log('annexbNalu last 10:',annexbNalu.slice(20500,20515))
	  // console.log('nalu last 10',annexbNalu.slice(20500,20510))

    Decoder.setReadyCb(async () => {
	    const de = new Decoder('h264')    // 可选 h264/h265
	    // console.log('promise方式读取结果',buffer,bytesRead)
	    try{
	    	 de.put(annexbNalu)     // buf 需要是 Uint8Array 类型
		    // get: 取出一帧数据（如果有的话, 否则返回 null ）
		    // 一个对象，包含 width、height、data
		    // 其中 data 是 Uint8Array 类型，RGBA，可以直接复制到 ImageData 对象中
		    let rawImageData = de.get() 
		    if(rawImageData){
		        console.log('解析结果',rawImageData) 
		        var jpegImageData = jpeg.encode(rawImageData,80);
		        fs.writeFileSync(`${filename}-out-00.jpg`, jpegImageData.data);
		    }else{
		        console.log('解码失败1')
		    } 
		     de.dispose()    // 不再使用后要释放资源     
	    }catch(err){
	    	console.log(err)
	    	 console.log('解码失败2')
	    }
	})
}

main()
